package com.kdg.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 * Created by kong on 2018/5/25.
 */
public class DynamicProxy {

    public static void main(String[] args) {
        UserDaoImpl userDao = new UserDaoImpl();  //目标对象
        //原始类型
        System.out.println(userDao.getClass());
        //给目标对象创建代理对象
        IUserDao proxyInstance = (IUserDao) new ProxyFactory(userDao).getProxyInstance();
        //代理之后的类型
        System.out.println(userDao.getClass());
        //代理对象运行
        proxyInstance.save();
        proxyInstance.select();
        /**
         * 动态代理：
         *      1.代理对象不需要实现接口，但是目标对象必须要实现接口，不然会出现ClassCastException异常
         *      2.代理对象的生成是利用JDK的API，动态的在内存中构建代理对象（需要我们指定目标对象和目标对象实现的接口）
         *      3.动态代理别名：JDK代理  接口代理
         *      4.核心类：java.lang.reflect.Proxy
         *      5.代理对象和目标对象的Class相同
         */
    }
}

class ProxyFactory{

    private Object target;

    public ProxyFactory(Object object) {
        this.target = object;
    }

    public Object getProxyInstance(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(method.getName());
                        System.out.println("代理对象方法执行");
                        Object invoke = method.invoke(target, args);
                        System.out.println("代理对象方法执行结束");
                        return invoke;
                    }
                });
    }
}
